package com.fast.develop.core.context;

import com.fast.develop.core.ModuleConfiguration;
import com.fast.develop.core.ModuleContextFactory;
import com.fast.develop.core.persistence.DomainModelManager;
import com.fast.develop.core.registry.ModuleRegistry;
import com.fast.develop.meta.base.MetaConfiguration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 莫寅
 * @createTime 2022-06-08 19:08
 * @desc：
 */
public abstract class AbstractModuleContextFactory<T extends ModuleConfiguration> implements ModuleContextFactory<T> {


    private Map<String, ModuleContext> domainModuleContexts = new HashMap<>();

    private static final String DEFAULT_KEY = "default";

    private ModuleContext defaultDomainModuleContext;

    private ModuleRegistry moduleRegistry;

    private MetaConfiguration metaConfiguration;

    public AbstractModuleContextFactory(MetaConfiguration metaConfiguration, ModuleRegistry moduleRegistry) {
        this.moduleRegistry = moduleRegistry;
        this.metaConfiguration = metaConfiguration;
    }

    @Override
    public ModuleContext create(T moduleConfiguration) {
        return create(DEFAULT_KEY, moduleConfiguration);
    }

    @Override
    public ModuleContext create(String id, T moduleConfiguration) {
        AbstractModuleContext domainModuleContext = createModuleContext(id, moduleConfiguration);

        domainModuleContext.refresh();
        domainModuleContexts.put(id, domainModuleContext);

        if(id.equalsIgnoreCase(DEFAULT_KEY)){
            this.defaultDomainModuleContext = domainModuleContext;
        }
        return domainModuleContext;
    }

    protected abstract AbstractModuleContext createModuleContext(String id, T moduleConfiguration);

    @Override
    public void destroy(){
        AbstractModuleContext defaultModuleContext = (AbstractModuleContext) getDomainModuleContext();
        if(defaultModuleContext != null){
            defaultModuleContext.destroy();
        }

        this.defaultDomainModuleContext = null;
        this.domainModuleContexts.remove(DEFAULT_KEY);
    }


    @Override
    public ModuleContext getDomainModuleContext(String id) {
        return domainModuleContexts.get(id);
    }

    @Override
    public ModuleContext getDomainModuleContext() {
        return domainModuleContexts.get(DEFAULT_KEY);
    }

    @Override
    public DomainModelManager getDomainModelManager() {
        return defaultDomainModuleContext.getDomainModelManager();
    }
}
